package br.com.conhecimento.ejb.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.conhecimento.core.data.GestaoUsuarioDao;
import br.com.conhecimento.core.model.GestaoAcesso;
import br.com.conhecimento.core.model.GestaoUsuario;
import br.com.conhecimento.ejb.client.vo.funcionalidade.AutenticacaoUsuarioVO;
import br.com.conhecimento.ejb.client.vo.modelo.AcessoVO;
import br.com.conhecimento.ejb.client.vo.modelo.MenuItemVO;
import br.com.conhecimento.ejb.client.vo.modelo.MenuVO;
import br.com.conhecimento.ejb.client.vo.modelo.TipoUsuarioVO;
import br.com.conhecimento.ejb.client.vo.modelo.UsuarioVO;
import br.com.conhecimento.ejb.server.util.Utils;

@Service
@Transactional
public class AutenticacaoService {

	@Autowired
	private GestaoUsuarioDao gestaoUsuarioDao;

	@Autowired
	private JavaMailSender mailSender;

	@Autowired
	private SimpleMailMessage alertMailMessage;

	public AutenticacaoUsuarioVO autenticarUsuario(
			AutenticacaoUsuarioVO autenticacaoUsuarioVO) {

		try {
			GestaoUsuario usuario = gestaoUsuarioDao.getUsuarioByLogin(autenticacaoUsuarioVO.getLogin());

			if (usuario == null) {
				autenticacaoUsuarioVO.setStatus(AutenticacaoUsuarioVO.StatusAutenticacaoUsuarioEnum.USUARIO_NAO_EXISTE);
				return autenticacaoUsuarioVO;
			}

			if (usuario.getSenha() == null) {
				autenticacaoUsuarioVO.setStatus(AutenticacaoUsuarioVO.StatusAutenticacaoUsuarioEnum.ERRO);
				return autenticacaoUsuarioVO;
			}
			
			UsuarioVO usuarioVo = new UsuarioVO();
			
			usuarioVo.setNome(usuario.getNome());
			usuarioVo.setEmail(usuario.getEmail());
			usuarioVo.setId(usuario.getId().longValue());
			
			if(usuario.getTipoUsuario() != null) {
				TipoUsuarioVO tipoUsuario = new TipoUsuarioVO();
				tipoUsuario.setId(usuario.getTipoUsuario().getId());
				tipoUsuario.setDescricao(usuario.getTipoUsuario().getDescricao());
				
				if(usuario.getTipoUsuario().getAcessos() != null && !usuario.getTipoUsuario().getAcessos().isEmpty()) {
					for(GestaoAcesso a : usuario.getTipoUsuario().getAcessos()) {
						AcessoVO acessoVo = new AcessoVO();
						
						acessoVo.setAtivo(a.getAtivo());
						acessoVo.setId(a.getId());
						
						if(a.getMenuItem() != null) {
							
							MenuItemVO menuItem = new MenuItemVO();
							menuItem.setId(a.getMenuItem().getId());
							menuItem.setDescricao(a.getMenuItem().getDescricao());
							menuItem.setImgLink(a.getMenuItem().getImgLink());
							menuItem.setLink(a.getMenuItem().getLink());
							menuItem.setAtivo(a.getMenuItem().getAtivo());
							
							if(a.getMenuItem().getMenu() != null) {
								MenuVO menu = new MenuVO();
								menu.setAtivo(a.getMenuItem().getMenu().getAtivo());
								menu.setDescricao(a.getMenuItem().getMenu().getDescricao());
								menu.setId(a.getMenuItem().getMenu().getId());
								menu.setImg(a.getMenuItem().getMenu().getImg());
								menuItem.setMenu(menu);
							}
							
							acessoVo.setMenuItem(menuItem);
						}
						
						tipoUsuario.getAcessos().add(acessoVo);
					}
				}
				
				usuarioVo.setPerfil(tipoUsuario);
			}
			
			autenticacaoUsuarioVO.setUsuarioVo(usuarioVo);

		} catch (Exception e) {
			Utils.sendMailException(alertMailMessage, mailSender,
					"ERRO AO CONSULTAR COMBO DE PRIORIDADES", e);
		}

		autenticacaoUsuarioVO.setStatus(AutenticacaoUsuarioVO.StatusAutenticacaoUsuarioEnum.SUCESSO);
		return autenticacaoUsuarioVO;

	}
}
